{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import matplotlib\n",
    "matplotlib.rcParams['mathtext.fontset'] = 'stix'\n",
    "matplotlib.rcParams['font.family'] = 'STIXGeneral'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import itertools\n",
    "def flip(items, ncol):\n",
    "    return itertools.chain(*[items[i::ncol] for i in range(ncol)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x252 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "num_nodes = [4, 8, 16, 32, 64, 128, 256]\n",
    "\n",
    "# from ../client/gas_evaluation.py\n",
    "data = {\n",
    "    'registration':    [575656, 575528, 575336,  575784,  575656,  575720,  575656],\n",
    "    'key sharing':     [ 65252,  86584, 129255,  214560,  385087,  726381, 1410760],\n",
    "    'finalization':    [410586, 430172, 470231,  550245,  710949, 1036015, 1699957],\n",
    "    'dispute':         [343105, 447148, 655634, 1072419, 1905875, 3574766, 6917072],\n",
    "}\n",
    "\n",
    "for i, (phase, consumed_gas) in enumerate(data.items()):\n",
    "    plt.plot(num_nodes, \n",
    "             consumed_gas, \n",
    "             linestyle=['-', '--', '-.', ':'][i], \n",
    "             marker=['o', 'D', 's', '^'][i], \n",
    "             label=phase)\n",
    "    \n",
    "fig.set_size_inches(6, 3.5)\n",
    "ax.grid(True)\n",
    "ax.set_xlabel('number of nodes')\n",
    "ax.set_ylabel('consumed gas')\n",
    "\n",
    "ax.set_xscale('log')\n",
    "ax.set_xticks(num_nodes)\n",
    "ax.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())\n",
    "ax.set_xlim([3.5, 280])\n",
    "\n",
    "ax.set_yscale('log')\n",
    "ax.set_yticks([50_000, 100_000, 200_000, 400_000, 800_000, 1_600_000, 3_200_000, 6_400_000])\n",
    "ax.get_yaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())\n",
    "\n",
    "plt.minorticks_off()\n",
    "ax.set_title(' ')\n",
    "\n",
    "handles, labels = ax.get_legend_handles_labels()\n",
    "\n",
    "plt.plot([0, 400], [8_000_000]*2, color='black', label='block gas limit')\n",
    "plt.legend(flip(handles, 2), flip(labels, 2), loc='upper left', ncol=2, bbox_to_anchor=(0.0, 0.95))\n",
    "\n",
    "# plt.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=10)\n",
    "\n",
    "plt.savefig('gas-consumption.pdf', bbox_inches='tight', pad_inches=0)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
